using System.Collections.Generic;
using TestCases.CompareAssert.Core.Comparers.Interfaces;
using TestCases.CompareAssert.Core.Comparers.Members;
using TestCases.CompareAssert.Core.Interfaces;

namespace TestCases.CompareAssert.Settings.Interfaces
{
    public interface ICompareSettings // State machine
    {
        bool Setup(ICompareContext context);
        void Restore();
        
        IResultSettings GetResult();
        IObjectComparer GetComparer();

        bool IsDisabledComparer(string name);
        bool IsDisabledGenericComparer(string name);
        bool IsIgnoredEntry(object key);
        bool IsIgnoredElement(long index);
        bool IsIgnoredElement(long[] indexes);
        bool IsIgnoredField(string field);
        bool IsIgnoredProperty(string property);
        
        AccessFlags PropertiesFlags { get; }
        AccessFlags FieldsFlags { get; }

        bool IsEqualsComparerForced { get; }
        bool IsHashCodeComparerForced { get; }
        bool IsReadOnlyPropertiesIgnored { get; }
        IEqualityComparer<object> KeysComparer { get; }        

    }
}